/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.isd.pool.modelo;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.persistence.Basic;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

/**
 *
 * @author ctrosch
 */

@Entity
@Table(name = "USR_POOL")
public class Pool implements Serializable {
    private static final long serialVersionUID = 1L;
    
    @Id
    @Basic(optional = false)
    @Column(name = "USR_POOL_NRPOOL", nullable = false)
    private Integer nroPool;

    @Column(name = "USR_POOL_DESCRP", length = 80)
    private String descripcion;

    @ManyToOne()
    @JoinColumn(name = "USR_POOL_POOLTH", referencedColumnName = "USR_POOLTH_CODIGO")
    private PoolTipo tipo;

    @Column(name = "USR_POOL_DISDES")
    @Temporal(TemporalType.TIMESTAMP)
    private Date disponibleDesde;
    @Column(name = "USR_POOL_DISHAS")
    @Temporal(TemporalType.TIMESTAMP)
    private Date disponibleHasta;

    @Column(name = "USR_POOL_FCHFIN")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fechaFin;    

    @Column(name = "USR_POOL_ESTADO", length = 40)
    private String estado;
    
    @Column(name = "USR_POOL_CNTTOT", precision = 18, scale = 4)
    private BigDecimal cantidadTotal;
    
    @Column(name = "USR_POOL_CNTDIS", precision = 18, scale = 4)
    private BigDecimal cantidadDisponible;
    
    @Lob
    @Column(name = "USR_POOL_TEXTOS", length = 2147483647)
    private String observaciones;

    @Lob
    @Column(name = "USR_POOL_PATHIB", length = 2147483647)
    private String pathImagenBanner;
    @Lob
    @Column(name = "USR_POOL_PATHIC", length = 2147483647)
    private String pathImagenInicioCompra;

    @Lob
    @Column(name = "USR_POOL_PATHFC", length = 2147483647)
    private String pathImagenFinCompra;

    @Lob
    @Column(name = "USR_POOL_PATHPF", length = 2147483647)
    private String pathImagenPoolFinalizado;

    @Column(name = "USR_POOL_MPOOLB",length=1)
    private String muestraPoolBanner;
    @Column(name = "USR_POOL_MPOOLC",length=1)
    private Character muestraPoolCatalogo;
    @Column(name = "USR_POOL_MPOOLP",length=1)
    private Character muestraPoolPrincipal;
    
    @Column(name = "USR_POOL_TIPACC",length=1)
    private String tipoAcceso;    
    
    @Column(name = "USR_POOL_MOSCAN",length=1)
    private String muestraCantidad;    
    
    @Column(name = "USR_POOL_MOSCON",length=1)
    private String muestraContador;    
        
    @Column(name = "USR_POOL_CODACC", length = 40)
    private String codigoAcceso;

    @Column(name = "USR_POOL_CNTMIN", precision = 2, scale = 4)
    private BigDecimal cantidadMinimaTotal;
    @Column(name = "USR_POOL_CNTMAX", precision = 2, scale = 4)
    private BigDecimal cantidadMaximaTotal;    
    
    @Column(name = "USR_POOL_UNIMED",length=1)
    private String unidadMedida;
    
    @Column(name = "USR_POOL_TMPANU")
    private int tiempoMinimoAnulacion;

    @OneToMany(mappedBy = "pool", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private List<CondicionesPagoPool> condiconesDePago;

    @OneToMany(mappedBy = "pool", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @OrderBy("orden DESC")
    private List<ReservasPool> reservas;

    @OneToMany(mappedBy = "pool", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    @OrderBy("norden DESC")
    private List<ItemPicking> itemsPicking;

    @OneToMany(mappedBy = "pool", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private List<ItemProductoPool> productos;

    @OneToMany(mappedBy = "pool", cascade=CascadeType.ALL, fetch=FetchType.EAGER)
    private List<BasesCondicionesAdicionales> baseCondicionesAdicionales;

    @Lob
    @Column(name = "USR_POOL_ERROR", length = 2147483647)
    private String errores;
    
    @Column(name = "USR_TVPROH_TITUA4", length = 80)
    private String tituloA4Promocional;

    @Lob
    @Column(name = "USR_TVPROH_PATHA4", length = 2147483647)
    private String pathA4Promocional;
    
//    @Lob
//    @Column(name = "USR_TVPROH_PATHVI", length = 2147483647)
//    private String pathBannerVentaInternet;

    @Column(name = "USR_PO_FECALT")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecalt;
    @Column(name = "USR_PO_FECMOD")
    @Temporal(TemporalType.TIMESTAMP)
    private Date fecmod;
    @Column(name = "USR_PO_USERID", length = 15)
    private String userId;
    @Column(name = "USR_PO_ULTOPR", length=1)
    private String ultopr;
    @Column(name = "USR_PO_DEBAJA", length=1)
    private String debaja;
    @Column(name = "USR_PO_OALIAS", length = 10)
    private String oalias;
    
    @Transient
    private boolean activa;

    @Transient
    private int porcentaje;

    public Pool() {
        
        this.productos = new ArrayList<ItemProductoPool>();        
        this.errores = "";
        this.estado = EstadoPool.NoActivo;
        this.debaja = "N";
        this.fecalt = new Date();
        this.fecmod = new Date();
        this.userId = "ADMIN";
        this.ultopr = "A";
        this.oalias = "USR_POOL";

        this.cantidadMinimaTotal = BigDecimal.ZERO;
        this.cantidadMaximaTotal = BigDecimal.ZERO;
        this.tiempoMinimoAnulacion = 120;
        this.tipoAcceso = "P";
        this.muestraCantidad = "S";
        this.muestraContador = "N";

        this.productos = new ArrayList<ItemProductoPool>();
        this.condiconesDePago = new ArrayList<CondicionesPagoPool>();
        this.baseCondicionesAdicionales = new ArrayList<BasesCondicionesAdicionales>();

        disponibleDesde = new Date();
        

    }

    public Pool(Integer usrPoolNrpool) {

        this.nroPool = usrPoolNrpool;
        this.productos = new ArrayList<ItemProductoPool>();        
        this.errores = "";
        this.estado = EstadoPool.NoActivo;
        this.debaja = "N";
        this.fecalt = new Date();
        this.fecmod = new Date();
        this.userId = "ADMIN";
        this.ultopr = "A";
        this.oalias = "USR_POOL";

        this.cantidadMinimaTotal = BigDecimal.ZERO;
        this.cantidadMaximaTotal = BigDecimal.ZERO;
        this.tiempoMinimoAnulacion = 120;
        
        this.tipoAcceso = "P";
        this.muestraCantidad = "S";
        this.muestraContador = "N";

        this.productos = new ArrayList<ItemProductoPool>();
        this.condiconesDePago = new ArrayList<CondicionesPagoPool>();
        this.baseCondicionesAdicionales = new ArrayList<BasesCondicionesAdicionales>();

        disponibleDesde = new Date();     
    }

    public Date getDisponibleHasta() {
        return disponibleHasta;
    }

    public void setDisponibleHasta(Date DisponibleHasta) {
        this.disponibleHasta = DisponibleHasta;
    }

    public BigDecimal getCantidadDisponible() {

        return cantidadDisponible;
    }

    public String getMuestraCantidad() {
        return muestraCantidad;
    }

    public void setMuestraCantidad(String muestraCantidad) {
        this.muestraCantidad = muestraCantidad;
    }

    public String getMuestraContador() {
        return muestraContador;
    }

    public void setMuestraContador(String muestraContador) {
        this.muestraContador = muestraContador;
    }
    
    public void setCantidadDisponible(BigDecimal cantidadDisponible) {
        this.cantidadDisponible = cantidadDisponible;
    }

    public BigDecimal getCantidadTotal() {
        return cantidadTotal;
    }

    public void setCantidadTotal(BigDecimal cantidadTotal) {
        this.cantidadTotal = cantidadTotal;
    }
    
    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public Date getDisponibleDesde() {
        return disponibleDesde;
    }

    public void setDisponibleDesde(Date disponibleDesde) {
        this.disponibleDesde = disponibleDesde;
    }

    public Date getFechaFin() {
        return fechaFin;
    }

    public void setFechaFin(Date fechaFin) {
        this.fechaFin = fechaFin;
    }

    public String getMuestraPoolBanner() {
        return muestraPoolBanner;
    }

    public void setMuestraPoolBanner(String muestraPoolBanner) {
        this.muestraPoolBanner = muestraPoolBanner;
    }

    public Character getMuestraPoolCatalogo() {
        return muestraPoolCatalogo;
    }

    public void setMuestraPoolCatalogo(Character muestraPoolCatalogo) {
        this.muestraPoolCatalogo = muestraPoolCatalogo;
    }

    public Character getMuestraPoolPrincipal() {
        return muestraPoolPrincipal;
    }

    public void setMuestraPoolPrincipal(Character muestraPoolPrincipal) {
        this.muestraPoolPrincipal = muestraPoolPrincipal;
    }

    public Integer getNroPool() {
        return nroPool;
    }

    public void setNroPool(Integer nroPool) {
        this.nroPool = nroPool;
    }

    public String getObservaciones() {
        return observaciones;
    }

    public void setObservaciones(String observaciones) {
        this.observaciones = observaciones;
    }

    public String getPathImagenBanner() {
        return pathImagenBanner;
    }

    public void setPathImagenBanner(String pathImagenBanner) {
        this.pathImagenBanner = pathImagenBanner;
    }

    public String getErrores() {
        return errores;
    }

    public void setErrores(String errores) {
        this.errores = errores;
    }

    public BigDecimal getCantidadMaximaTotal() {
        return cantidadMaximaTotal;
    }

    public void setCantidadMaximaTotal(BigDecimal cantidadMaximaTotal) {
        this.cantidadMaximaTotal = cantidadMaximaTotal;
    }

    public BigDecimal getCantidadMinimaTotal() {
        return cantidadMinimaTotal;
    }

    public void setCantidadMinimaTotal(BigDecimal cantidadMinimaTotal) {
        this.cantidadMinimaTotal = cantidadMinimaTotal;
    }

    public String getPathImagenFinCompra() {
        return pathImagenFinCompra;
    }

    public void setPathImagenFinCompra(String pathImagenFinCompra) {
        this.pathImagenFinCompra = pathImagenFinCompra;
    }

    public String getPathImagenInicioCompra() {
        return pathImagenInicioCompra;
    }

    public void setPathImagenInicioCompra(String pathImagenInicioCompra) {
        this.pathImagenInicioCompra = pathImagenInicioCompra;
    }

    public String getPathImagenPoolFinalizado() {
        return pathImagenPoolFinalizado;
    }

    public void setPathImagenPoolFinalizado(String pathImagenPoolFinalizado) {
        this.pathImagenPoolFinalizado = pathImagenPoolFinalizado;
    }
    
    public List<CondicionesPagoPool> getCondiconesDePago() {
        return condiconesDePago;
    }

    public void setCondiconesDePago(List<CondicionesPagoPool> condiconesDePago) {
        this.condiconesDePago = condiconesDePago;
    }

    public List<ReservasPool> getReservas() {
        return reservas;
    }

    public void setReservas(List<ReservasPool> reservas) {
        this.reservas = reservas;
    }

    public List<ItemProductoPool> getProductos() {
        return productos;
    }

    public void setProductos(List<ItemProductoPool> productos) {
        this.productos = productos;
    }

    public String getDebaja() {
        return debaja;
    }

    public void setDebaja(String debaja) {
        this.debaja = debaja;
    }

    public Date getFecalt() {
        return fecalt;
    }

    public void setFecalt(Date fecalt) {
        this.fecalt = fecalt;
    }

    public Date getFecmod() {
        return fecmod;
    }

    public void setFecmod(Date fecmod) {
        this.fecmod = fecmod;
    }

    public String getOalias() {
        return oalias;
    }

    public void setOalias(String oalias) {
        this.oalias = oalias;
    }

    public String getUltopr() {
        return ultopr;
    }

    public void setUltopr(String ultopr) {
        this.ultopr = ultopr;
    }

    public String getUserId() {
        return userId;
    }

    public void setUserId(String userId) {
        this.userId = userId;
    }

    public List<ItemPicking> getItemsPicking() {
        return itemsPicking;
    }

    public void setItemsPicking(List<ItemPicking> itemsPicking) {
        this.itemsPicking = itemsPicking;
    }

    public int getTiempoMinimoAnulacion() {
        return tiempoMinimoAnulacion;
    }

    public void setTiempoMinimoAnulacion(int tiempoMinimoAnulacion) {
        this.tiempoMinimoAnulacion = tiempoMinimoAnulacion;
    }

    public boolean isActiva() {
        
        try {
            
            if (disponibleDesde.before(new Date())
                    && (disponibleHasta.after(new Date()))
                    && estado.equals(EstadoPool.Activo)
                    && cantidadDisponible.compareTo(BigDecimal.ZERO) > 0) {
                activa = true;
            } else {
                activa = false;
            }
        } catch (Exception e) {
            activa =  false;
        }

        return activa;
    }

    public String getStringDisponibleHasta(){

        String s ="";
        Calendar f = Calendar.getInstance();
        f.setTime(getDisponibleHasta());

        s = s + String.valueOf(f.get(Calendar.YEAR)) + ",";
        s = s + String.valueOf(f.get(Calendar.MONTH)) + ",";
        s = s + String.valueOf(f.get(Calendar.DAY_OF_MONTH)) + ",";

        if(f.get(Calendar.AM_PM)==Calendar.AM){
            s = s + String.valueOf(f.get(Calendar.HOUR)) + ",";
        }else{
            s = s + String.valueOf(12+f.get(Calendar.HOUR)) + ",";
        }

        s = s + String.valueOf(f.get(Calendar.MINUTE)) + ",";
        s = s + String.valueOf(f.get(Calendar.SECOND)) ;
        return s;
    }

    public void setPorcentaje(int porcentaje) {
        this.porcentaje = porcentaje;
    }

    public int getPorcentaje(){

        try {
            float d = getCantidadDisponible().floatValue();
            float t = getCantidadTotal().floatValue();
            float r = 100 - d / t * 100;

            //Si el total es igual a cero retorna cero
            if(t==0) return 0;

            //Si lo disponible es mayor al total
            if(d>t) return 0;

            return new BigDecimal(r).intValue();

        } catch (Exception e) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "getPorcentaje", e);            
            return 0;
        }
    }

    public void setActiva(boolean activa) {
        this.activa = activa;
    }

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public PoolTipo getTipo() {
        return tipo;
    }

    public void setTipo(PoolTipo tipo) {
        this.tipo = tipo;
    }

    public List<BasesCondicionesAdicionales> getBaseCondicionesAdicionales() {
        return baseCondicionesAdicionales;
    }

    public void setBaseCondicionesAdicionales(List<BasesCondicionesAdicionales> baseCondicionesAdicionales) {
        this.baseCondicionesAdicionales = baseCondicionesAdicionales;
    }

    public String getTipoAcceso() {
        return tipoAcceso;
    }

    public void setTipoAcceso(String tipoAcceso) {
        this.tipoAcceso = tipoAcceso;
    }

    public String getCodigoAcceso() {
        return codigoAcceso;
    }

    public void setCodigoAcceso(String codigoAcceso) {
        this.codigoAcceso = codigoAcceso;
    }

    public String getPathA4Promocional() {
        return pathA4Promocional;
    }

    public void setPathA4Promocional(String pathA4Promocional) {
        this.pathA4Promocional = pathA4Promocional;
    }

    public String getTituloA4Promocional() {
        return tituloA4Promocional;
    }

    public void setTituloA4Promocional(String tituloA4Promocional) {
        this.tituloA4Promocional = tituloA4Promocional;
    }

    public String getUnidadMedida() {
        return unidadMedida;
    }

    public void setUnidadMedida(String unidadMedida) {
        this.unidadMedida = unidadMedida;
    }
    
            
    @Override
    public int hashCode() {
        int hash = 0;
        hash += (nroPool != null ? nroPool.hashCode() : 0);
        return hash;
    }
    
    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Pool)) {
            return false;
        }
        Pool other = (Pool) object;
        if ((this.nroPool == null && other.nroPool != null) || (this.nroPool != null && !this.nroPool.equals(other.nroPool))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "tv.pool.modelo.Pool[usrPoolNrpool=" + nroPool + "]";
    }

}

